/**
 * Created by THTF on 2018/3/21.
 */
(function ($){

    //构造函数
    function PreLoad(imgs,options){
        this.imgs =  (typeof imgs === 'string') ? [imgs] : imgs;//如果传的是数组不变，如果传的是字符串，把字符串变成数组。
        this.opts = $.extend({},PreLoad.DEFAULTS,options);//保存属性

        if(this.opts.order === 'ordered'){
            this._ordered();//有序加载
        }else{
            this._unoredered();//方法前加下划线表示这个方法只在插件内部使用，而不提供外部调用。
        }

    }

    //默认参数
    PreLoad.DEFAULTS = {
        order: 'unordered', //默认情况无序预加载
        each : null,//每张图片加载完毕后执行
        all : null//所有图片加载完毕后执行
    };

    PreLoad.prototype._unoredered = function (){ //无序加载
        var imgs = this.imgs,
            opts = this.opts,
            count = 0,
            len = imgs.length;
        $.each(imgs,function(i,src){
            if(typeof src === 'string'){
                return;
            }
            var imgObj = new Image();

            $(imgObj).on('load error',function(){
                //每张图片加载完毕后执行
                opts.each && opts.each(count);//如果没传参，那么opts就就是null
                //所有图片加载完毕后执行
                if(count >= len - 1){
                    opts.all && opts.all();
                }
                count++;
            });

            imgObj.src = src;
        });
    };

    PreLoad.prototype._ordered = function() {
        var opts = this.opts,
            imgs = this.imgs,
            len = imgs.length,
            count = 0;
        load();
        function load() {
            var imgObj = new Image();
            $(imgObj).on('load error', function() {
                opts.each && opts.each(count);
                if (count >= len) {
                    //所有图片已经加载完毕
                    opts.all && opts.all();
                } else {
                    load();
                }
                count++;
            });
            imgObj.src = imgs[count];
        }
    };

    /* $.fn.extend -> $('#img').preload();
         $.extend -> $.preload();工具方法*/

    $.extend({
        preload : function(imgs,opts){
            new PreLoad(imgs,opts);
        }
    })

})(jQuery);